package br.com.velp.vskygeo.controller;

import br.com.velp.vskygeo.dto.HistoricoDadoLidoDTO;
import br.com.velp.vskygeo.dto.UltimoDadoLidoResultadoConsultaDTO;
import br.com.velp.vskygeo.enumerator.PeriodoVisualizarPercursoEnum;
import br.com.velp.vskygeo.service.MysqlService;
import br.com.velp.vskygeo.util.MensagemUtil;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.*;
import org.lindbergframework.spring.scope.AccessScoped;
import org.primefaces.context.RequestContext;
import org.primefaces.model.map.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

/**
 *
 * @author Eduardo
 */
@Controller("controllerVisualizarPercurso")
@AccessScoped
public class ControllerVisualizarPercurso implements Serializable {

    private Short periodo;
    private Date dataInicial;
    private Date dataFinal;
    private MapModel mapModel;
    private Polyline polyline;
    private Double maiorLatitude;
    private Double maiorLongitude;
    private UltimoDadoLidoResultadoConsultaDTO dadoLido;
    private List<HistoricoDadoLidoDTO> historicoDadoLido;
    
    @Autowired
    private MysqlService mysqlService;

    public void exibirPainelVisualizarPercurso(UltimoDadoLidoResultadoConsultaDTO dadoLido) {

        this.mapModel = new DefaultMapModel();
        this.dadoLido = dadoLido;
        this.periodo = new Short("1");
        this.historicoDadoLido = new ArrayList<HistoricoDadoLidoDTO>();

        RequestContext.getCurrentInstance().execute("pn_visualizar_percurso.show();");

    }

    public void recuperarHistorico() {
        
        this.maiorLatitude = 0.0;
        this.maiorLongitude = 0.0;
        
        this.polyline = new Polyline();
        this.polyline.setStrokeWeight(4);
        this.polyline.setStrokeColor("#191970");
        this.polyline.setStrokeOpacity(0.7);

        gerenciarDatasInicioFim();

        this.historicoDadoLido = this.mysqlService.obterHistoricoDadoLido(this.dadoLido.getIdMonitorado(), this.dataInicial, this.dataFinal);

        if (this.historicoDadoLido.isEmpty()) {
            
            MensagemUtil.exibirMensagemInformacao("Nenhum Registro Encontrado.");
            return;
            
        } 

        for (HistoricoDadoLidoDTO historico : this.historicoDadoLido) {
            
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");

            LatLng latitudeLongitude = new LatLng(historico.getLatitude(), historico.getLongitude());
            
            this.polyline.getPaths().add(latitudeLongitude);
            
            Marker marker = new Marker(latitudeLongitude, sdf.format(historico.getData()), historico, "./resources/imagens/marcador_custom.png");
            this.mapModel.addOverlay(marker);
            
            if (historico.getLatitude() < this.maiorLatitude) {
                this.maiorLatitude = historico.getLatitude();
            }
            
            if (historico.getLongitude() < this.maiorLongitude) {
                this.maiorLongitude = historico.getLongitude();
            }

        }

        this.mapModel.addOverlay(this.polyline);
        
    }

    public void gerenciarDatasInicioFim() {

        Calendar calendar = GregorianCalendar.getInstance();

        if (PeriodoVisualizarPercursoEnum.UMA_HORA.getValue().equals(this.periodo)) {
            calendar.setTime(new Date());
            calendar.roll(Calendar.HOUR, -1);
            this.dataInicial = calendar.getTime();
            this.dataFinal = new Date();
        } else if (PeriodoVisualizarPercursoEnum.SEIS_HORAS.getValue().equals(this.periodo)) {
            calendar.setTime(new Date());
            calendar.roll(Calendar.HOUR, -6);
            this.dataInicial = calendar.getTime();
            this.dataFinal = new Date();
        } else if (PeriodoVisualizarPercursoEnum.VINTE_QUATRO_HORAS.getValue().equals(this.periodo)) {
            calendar.setTime(new Date());
            calendar.roll(Calendar.DATE, -1);
            this.dataInicial = calendar.getTime();
            this.dataFinal = new Date();
        } else {
            this.dataInicial.setHours(0);
            this.dataInicial.setMinutes(0);
            this.dataInicial.setSeconds(0);
            this.dataFinal.setHours(23);
            this.dataFinal.setMinutes(59);
            this.dataFinal.setSeconds(59);
        }

    }

    public void limparDatasInicialFinal() {

        if (PeriodoVisualizarPercursoEnum.POR_PERIODO.getValue().equals(this.periodo)) {
            this.dataInicial = null;
            this.dataFinal = null;
        }

    }

    // <editor-fold desc="GETTERS AND SETTERS" defaultstate="collapsed">            
    public UltimoDadoLidoResultadoConsultaDTO getDadoLido() {
        return dadoLido;
    }

    public void setDadoLido(UltimoDadoLidoResultadoConsultaDTO dadoLido) {
        this.dadoLido = dadoLido;
    }

    public Short getPeriodo() {
        return periodo;
    }

    public void setPeriodo(Short periodo) {
        this.periodo = periodo;
    }

    public Date getDataFinal() {
        return dataFinal;
    }

    public void setDataFinal(Date dataFinal) {
        this.dataFinal = dataFinal;
    }

    public Date getDataInicial() {
        return dataInicial;
    }

    public void setDataInicial(Date dataInicial) {
        this.dataInicial = dataInicial;
    }

    public List<HistoricoDadoLidoDTO> getHistoricoDadoLido() {
        return historicoDadoLido;
    }

    public void setHistoricoDadoLido(List<HistoricoDadoLidoDTO> historicoDadoLido) {
        this.historicoDadoLido = historicoDadoLido;
    }

    public Double getMaiorLatitude() {
        return maiorLatitude;
    }

    public void setMaiorLatitude(Double maiorLatitude) {
        this.maiorLatitude = maiorLatitude;
    }

    public Double getMaiorLongitude() {
        return maiorLongitude;
    }

    public void setMaiorLongitude(Double maiorLongitude) {
        this.maiorLongitude = maiorLongitude;
    }

    public MapModel getMapModel() {
        return mapModel;
    }

    public void setMapModel(MapModel mapModel) {
        this.mapModel = mapModel;
    }
    
    public String getMaiorLatLong(){
        if (this.maiorLatitude == null || this.maiorLongitude == null) {
            return null;
        }
        return this.maiorLatitude.toString().concat(",").concat(this.maiorLongitude.toString());
    }  
    // </editor-fold>      
    
}
